/******************************************
Estacionamiento.java
Universidad del Valle de Guatemala
Algoritmos y Estructura de Datos
Autor:
    Martín Guzmán
Fecha: 15 de julio de 2009
Descripción: Implementación con arreglos
 * Simula una pila utilizando arreglos para
 * el manejo de la simulación
*******************************************/
import java.util.ArrayList;
import java.lang.reflect.Array;

public class Estacionamiento_implementacion_arreglo<G> implements Interfaz_stack<G> {
    private int disponibles;
    private final int max=10;
    private G[] arreglo;

    // método constructor
    public Estacionamiento_implementacion_arreglo()
    {
        disponibles=max;
        arreglo= (G[]) new Object[max];
    }

    //método que indica cuántos espacios le quedan disponibles
    public int getDisponibles(){
        return disponibles;
    }

    //método para ver el elemento del tope de la pila
    public G peek() {
        if (this.empty()==true)
        {
            return null;
        }
        G temporal = this.pop();
        this.push(temporal);
        return temporal;
    }

    //método para ver si la pila está llena
    public boolean full() {
        boolean temporal=false;
        if(this.disponibles==0){
            temporal=true;
        }
        return temporal;
    }

    //método para ver si la pila está vacía
    public boolean empty() {
        boolean temporal=false;
        if(this.disponibles==10){
            temporal=true;
        }
        return temporal;
    }

    //método que saca el último elemento de la pila
    public G pop(){
        if(this.empty()==true){
            System.out.println("*** Lo sentimos, no puede sacar el último elemento de la pila debido a que está vacía ****");
            return null;
        }
        G temporal=arreglo[this.ultima_Posicion()-1];
        arreglo[this.ultima_Posicion()-1]=null;
        disponibles+=1;
        return temporal;
    }

    
    //Devuelve la última posición que tiene un vehículo alamacenado
    public int ultima_Posicion(){
        int posicion=max-disponibles;
        return posicion;
    }

    //toString del la clase
    public String toString(){
        if(this.empty()==true){
            return "|--|--|--|--|--|--|--|--|--|--|";
        }
        String temporal = "|";
        for(int i=0;i<arreglo.length;i++)
            temporal+=""+((arreglo[i]!=null)?arreglo[i].toString():"--")+"|";
        return temporal;
    }

    //método que agrega un elemento a la pila
    public void push(G Elemento_G){

        if(full()!=true)
        {
            arreglo[this.ultima_Posicion()]=Elemento_G;
            disponibles-=1;
        }
        else
        {
            //esto no va a dar porque cuando se llama al método se controla esto...
            System.out.println("******** Lo sentimos, ya no hay espacios disponibles *****");
        }
    }
    
    //me retorna el índice en el que se encuentra el elemento dado
    //en caso de no encontrarse, retorna -1
    public int posicion_de(G Elemento_G){
        for(int i=0;i<this.arreglo.length;i++)
        {
            if(this.arreglo[i]!=null)
                if(this.arreglo[i].toString().compareTo(Elemento_G.toString())==0){
                    return i;
                }
        }
        return -1;
    }

}
